#include "doublelinklist.h"

doublelinklist_head_tail* Createdoublelinklist(){
    doublelinklist_head_tail* h=(doublelinklist_head_tail*)malloc(sizeof(doublelinklist_head_tail));
    if(h==NULL){
        printf("malloc doublelinklist_head_tail error\n");
        exit(-1);
    }

    h->head=h->tail=(doublelinklist*)malloc(sizeof(doublelinklist));
    if(h->head==NULL){
        printf("malloc h->head error\n");
        exit(-1);
    }

    h->len=0;

    h->head->front=NULL;
    h->tail->next=NULL;

    return h;
}

int InsertIntodoublelinklist(doublelinklist_head_tail* p,int post,int data){
    if(post<0||post>p->len){
        printf("insert data error:post is not true\n");
        return -1;
    }

    doublelinklist* temp=NULL;
    doublelinklist* pnew=(doublelinklist*)malloc(sizeof(doublelinklist));
    if(pnew==NULL){
        printf("malloc pnew error\n");
        exit(-1);
    }

    pnew->next=NULL;
    pnew->front=NULL;
    pnew->data=data;

    if(post==p->len){
        pnew->next=p->tail->next;
        p->tail->next=pnew;
        pnew->front=p->tail;
        p->tail=pnew;
    }else{
        if(post<p->len/2){
            temp=p->head;
            for(int i=0;i<post;i++){
                temp=temp->next;
            }
        }else{
            temp=p->tail;
            for(int i=p->len;i>post;i--){
                temp=temp->front;
            }
        }

        temp->next->front=pnew;
        pnew->next=temp->next;
        
        temp->next=pnew;
        pnew->front=temp;
    }
    p->len++;
    return 0;
}

void Showdoublinklist(doublelinklist_head_tail*p){
    doublelinklist *temp=p->head;
    while(temp->next!=NULL){
        temp=temp->next;
        printf("%d ",temp->data);
    }
    putchar(10);
}

int DeletePostdoublinklist(doublelinklist_head_tail* p,int post){
    if(post<0||post>p->len-1||IsEmptydoublelinklist(p)){
        printf("post or IsEmpty  error\n");
        return -1;
    }

    doublelinklist* temp=NULL;
    if(post<p->len/2){
        temp=p->head;
        for(int i=0;i<post+1;i++){
            temp=temp->next;
        }
    }else{
        temp=p->tail;
        for(int i=p->len-1;i>post;i--){
            temp=temp->front;
        }
    }

    temp->next->front=temp->front;
    temp->front->next=temp->next;
    free(temp);
    temp=NULL;
    p->len--;
    return 0; 
}

int DeleteDatadoublinklist(doublelinklist_head_tail* p,int data){
    doublelinklist* pdel=NULL;
    doublelinklist* temp=p->head;
    while(temp->next!=NULL){
        if(temp->next->data==data){
            pdel=temp->next;
            pdel->next->front=pdel->front;
            pdel->front->next=pdel->next;
            free(pdel);
            pdel=NULL;
        }else{
            temp=temp->next;
        }
    }
    return 0; 
}

bool IsEmptydoublelinklist(doublelinklist_head_tail* p){
    return p->head==p->tail;
}

int Lengthdoublelinklist(doublelinklist_head_tail* p){
    return p->len; 
}

int Changedoublelinklist(doublelinklist_head_tail* p,int post,int data){
    if(post<0||post>p->len-1||IsEmptydoublelinklist(p)){
        printf("Changedoublelinklist error\n");
        return -1;
    }

    doublelinklist* temp=NULL;
    if(post<p->len/2){
        temp=p->head;
        for(int i=0;i<post+1;i++){
            temp=temp->next;
        }
    }else{
        temp=p->tail;
        for(int i=p->len-1;i>post;i--){
            temp=temp->front;
        }
    }   

    temp->data=data;
    return 0; 
}

int Searchdoublelinklist(doublelinklist_head_tail* p,int data){
    doublelinklist* temp=p->head;
    int i=0;
    while(temp->next!=NULL){
        temp=temp->next;
        if(temp->data==data){
            return i;
        }else{
            i++;
        }
    }
   return -1; 
}
